package cn.edu.zsc.rbac.view;

import cn.edu.zsc.rbac.domain.dto.DeptDto;
import cn.edu.zsc.rbac.domain.vo.DeptVo;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.service.IDeptService;
import cn.edu.zsc.rbac.service.impl.DeptService;
import cn.edu.zsc.rbac.util.DateTimeUtils;
import cn.edu.zsc.rbac.util.SingletonFactory;


public class DeptView extends BaseView<DeptVo, IDeptService>{
    public static final String MENU = """
                ———————————————————————
                        部门管理
                ———————————————————————
                 |     0...返回上级    |
                 |     1...部门列表    |
                 |     2...创建部门    |
                 |     3...更新部门    |
                 |     4...删除部门    |
                ———————————————————————
                请输入选项:""";
    private DeptView() {
        service = SingletonFactory.getInstance(DeptService.class);
    }
    public void show() {
        String menuChoice;
        do {
            System.out.print(MENU);
            menuChoice = MainView.input.nextLine();
            switch (menuChoice) {
                case "0" -> System.out.println("已返回上⼀级菜单");
                case "1" -> list();
                case "2" -> create();
                case "3" -> update();
                case "4" -> delete();
                default -> printError("输⼊⾮法，请输⼊正确的菜单编号！");
            }
        } while (!"0".equals(menuChoice));
    }
    /**
            * 列出所有部⻔的信息。
            * <p>
 * 本⽅法调⽤服务层获取所有部⻔数据，并将其存储在缓存中。然后，输出所有部⻔的 ID、名
    称和电话，
            * 以表格形式显示在控制台中，供⽤户查看。
            * </p>
            */
    public void list() {
        // 调⽤服务层获取所有部⻔数据
        Result result = service.list();
        // 将获取到的部⻔数据存⼊缓存
        cache = (DeptVo[]) result.data;
        // 输出表头
        System.out.println("ID\t部⻔名称\t部⻔电话\t更新时间");
        // 遍历缓存中的每个部⻔对象，输出部⻔的ID、名称和电话
        for (DeptVo dept : cache) {
            if (dept != null) {
                // 格式化输出每个部⻔的详细信息
                System.out.printf("%d\t%-5s\t%-5s\t%s\n", dept.id, dept.phone, dept.name, DateTimeUtils.format(dept.updateAt));
            }
        }
    }
    /**
     * 创建⼀个新的部⻔。
     * <p>
     * 本⽅法会提示⽤户输⼊部⻔的名称和电话，并将这些信息封装到⼀个 `DeptDto` 对象中。
     * 然后调⽤服务层的创建⽅法，若创建成功，则输出成功信息并列出当前所有部⻔；若失败，则
     输出错误信息。
     * </p>
     */
    public void create() {
        // 提示⽤户输⼊部⻔名称
        System.out.print("请输⼊部⻔名称：");
        String name = MainView.input.nextLine(); // 获取⽤户输⼊的部⻔名称
        // 提示⽤户输⼊部⻔电话
        System.out.print("请输⼊部⻔电话：");
        String phone = MainView.input.nextLine(); // 获取⽤户输⼊的部⻔电话
        // 将⽤户输⼊的部⻔名称和电话封装到DeptDto对象中
        DeptDto dto = new DeptDto(name, phone);
        // 调⽤服务层的创建⽅法，创建新的部⻔
        Result result = service.create(dto);
        // 如果创建操作失败，输出错误信息
        if (!result.success) {
            printError(result.message);
            return; // 结束⽅法执⾏
        }
        // 创建成功，输出成功信息
        System.out.println(result.message);
        // 列出当前所有部⻔信息
        list();
    }
    /**
     * 更新指定部⻔的信息。
     * <p>
     * 本⽅法会提示⽤户输⼊部⻔的 ID，并验证该 ID 是否有效。然后从缓存中查找对应部⻔的数
     据，
     * 如果未找到部⻔，提示⽤户。如果找到部⻔，⽤户可以选择修改部⻔名称和电话，若⽤户没有
     修改，则保持原值。
     * 更新成功后，会返回更新结果并列出当前部⻔列表。
     * </p>
     */
    public void update() {
        // 在缓存中查找指定ID的部⻔，如果未找到部⻔，则返回
        DeptVo dept = getCacheById();
        if (dept == null) {
            return;
        }
        // 提示⽤户输⼊新的部⻔名称，按回⻋表示不修改
        System.out.print("请输⼊部⻔名称，直接按回⻋表示不修改：");
        String name = MainView.input.nextLine();
        // 如果⽤户没有输⼊新名称，保持原名称
        name = "".equals(name) ? dept.name : name;
        // 提示⽤户输⼊新的部⻔电话，按回⻋表示不修改
        System.out.print("请输⼊部⻔电话，直接按回⻋表示不修改：");
        String phone = MainView.input.nextLine();
        // 如果⽤户没有输⼊新电话，保持原电话
        phone = "".equals(phone) ? dept.phone : phone;
        // 创建新的 DeptDto 对象，⽤于更新部⻔信息
        DeptDto dto = new DeptDto(name, phone);
        // 调⽤服务层更新部⻔信息
        Result result = service.update(dto, dept.id);
        // 如果更新失败，显示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }
        // 更新成功，显示成功消息并列出部⻔信息
        System.out.println(result.message);
        list(); // 列出更新后的部⻔列表
    }
    /**
            * 删除指定部⻔信息。
            * <p>
 * 本⽅法会提示⽤户输⼊部⻔的 ID，并验证该 ID 是否有效。然后从缓存中查找对应部⻔数
    据，
            * 如果未找到部⻔，则提示⽤户。若找到部⻔，⽤户需确认是否删除该部⻔，确认后将删除该部
⻔。
        * 如果删除失败，则提示失败信息；删除成功后，重新列出部⻔信息。
            * </p>
            */
    public void delete() {
        DeptVo dept = getCacheById();
        if (dept == null) {
            return;
        }
        // 提示⽤户确认是否删除
        System.out.print("输⼊'Y'确认删除，输⼊其它取消删除：");
        String confirm = MainView.input.nextLine();
        // 如果⽤户输⼊的不是'Y'或'y'，则取消删除
        if (!"Y".equalsIgnoreCase(confirm)) {
            System.out.println("您已取消删除");
            return;
        }
        // 调⽤服务层进⾏删除操作
        Result result = service.delete(dept.id);
        // 如果删除操作失败，提示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }
        // 删除成功，输出成功信息并列出当前部⻔列表
        System.out.println(result.message);
        list();
    }
}
